#ifndef listechaineeUCTH
#define listechaineeUCTH
// BIBLIOTHEQUES
#include <vector>
#include <iostream>
#include <cstdlib>
#include <math.h>
#include "../all2.h"
#include "../EPlateau.h"
using namespace std;


// STRUCTURES DE DONNEES
struct maillonUCT
{
        // les donnees
        Coup coup ;
        int score ;   //score = somme brutale des pieces posées
        int nbJeux ;
    int scoreTemp;
    int nbJeuxTemp;
        // gerer la liste chainee
        struct maillonUCT *suivant ;
        bool libre ;
        bool lu;
};


// HEURISTIQUE
// Il va nous servir pour choisir quel emplacement joue a noeud n(i)
// On va se base sur un vecteur qui garde tous les mouvements possible, classé avec leur meilleur ratio
// de victoires / nombres de fois joues
class listeChaineeUCT
{
        private:
                maillonUCT * racine ;
                int nbMaillon ;

        std::ofstream * fichierlogthread;
        maillonUCT * last ;

        public:
                // CONSTRUCTEURS
                listeChaineeUCT() ; // cree la liste vide
                //constructeur par COPIE
                listeChaineeUCT(listeChaineeUCT * l);

                // ACCESSEURS
                maillonUCT* getRacine();
                int getNbMaillon();
                maillonUCT *existe(maillonUCT *m) ;

                // METHODES
                // ajoute un maillon dans la liste pour la garder dans l'ordre decroissant le ratio des Coup
                void ajouterMaillon(maillonUCT* m) ;

                // trouver le coup disponible avec le meilleur ratio
                Coup trouverMeilleurMaillon() ;

                //trovuer coup disp avec meilleur ratio, en tennant compte de ce qui ets jouable sur le Goban.
        Coup trouverMeilleurMaillon(Goban * g);

                // renvoi le ratio correspondant au Coup donne. Renvoi -1 si le coup n'existe pas
                float trouverRatio(Coup c) ;

                // augmente de 1 le nombre de jeux et remet les coups a 'libre'
                // augmente aussi les victoires si le boolean est a vrai
                void partieFinie(listeChaineeUCT * listeCustom) ;
                void partieFinie(bool b);

                // On veut jouer ce coup. La fonction verifie que le coup n'existe pas
                // deja Si  non, il est rajouter a la liste chainee
                void veutJouer(Coup c) ;

                //fonction qui permet de faire une initialisation des membres de la liste chainée.
                void addMaillonTrick(Coup c, int x);

                //reinitialise proprement la liste.
                void raz( );

                //fonction changeable de calcul de "score"
                float getRatio(maillonUCT monMaillon);



        //Supprime le maillon M auinsi que les suivants poitnés apr lui.
        void delMaillon( maillonUCT * m );

        //Diviser le nbJeux et le nbVictoires de tout les noeuds.
        void divise(int n);

        // affiche la liste des maillons dans la liste
        void afficherListeMaillons();

        //met a jour le vrai maillon (pas la copie) en fonction d'un maillon copié.
        void majVraiMaillon(maillonUCT * maillonCherche,listeChaineeUCT * listeChainee);

};

/* Listes des fichiers modifies avec la ligne
-------------
arbreUCT.cpp
-------------
200 -> 227 / 233 -> 241 / 128 -> 138


-----------
arbreUCT.h
-----------
27 -> 28 / 41 -> 43 / 73 -> 75
*/
#endif
